package model;

import java.math.BigDecimal;
import java.math.RoundingMode;

import org.encog.neural.data.NeuralDataPair;
import org.encog.neural.data.NeuralDataSet;

public class DataNormalizate {
		
	public void generateMaxValues(double[] arrayVeiculo){
		double[] arrayMaxValues = new double[arrayVeiculo.length-1];
		
		for (int i = 0; i < arrayVeiculo.length; i++) {
			if(arrayVeiculo[i] > arrayMaxValues[i]){
				arrayMaxValues[i] = arrayVeiculo[i];
			}
		}
		
//		return arrayMaxValues;
	}
	
	public void dataNormalizate(NeuralDataSet dataSet, int[] arrayMaxValues){
		int size = dataSet.getInputSize();
//		double[] arrayMaxValues = getMaxValues(dataSet);
		
		for(NeuralDataPair pair : dataSet){
			for (int i = 0; i < size; i++) {
				BigDecimal inputI = new BigDecimal(pair.getInput().getData(i));
				BigDecimal maxI = new BigDecimal(arrayMaxValues[i]);
					
				int casasDecimais = 9;
				
				if(arrayMaxValues[i] < 10000000){
					casasDecimais = 6;
				}
				
				BigDecimal divisao = inputI.divide(maxI, casasDecimais, RoundingMode.UP);
								
				pair.getInput().setData(i, divisao.doubleValue());
			}
			
			pair.getIdeal().setData(0, pair.getIdeal().getData(0) / arrayMaxValues[size]);
		}		
	}
	
	public int[] getMaxValues(NeuralDataSet dataSet){
		int size = dataSet.getInputSize() + 1;
		int[] arrayMaxValues = new int[size];
		
		for (NeuralDataPair pair : dataSet) {
			for (int i = 0; i < size; i++) {
				if(i == size-1){ //obtem o valor maximo da saida ideal
					if(pair.getIdeal().getData(0) > arrayMaxValues[i]){
						arrayMaxValues[i] = (int) pair.getIdeal().getData(0);
					}
				} else{ //obtem os valores maximos dos campos de entrada
					if (pair.getInput().getData(i) > arrayMaxValues[i]){
						arrayMaxValues[i] = (int) pair.getInput().getData(i);
					}
				}
				
			}
		}
		
		return arrayMaxValues;
	}
}
